package com.mastercard.assets.web.struts.actions;

import com.mastercard.assets.jpa.TblAgencia;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.util.to.TareaPendienteTO;
import com.mastercard.assets.web.util.to.UserLogin;

public class MenuTareasIn
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		System.out.println( "MenuTareasIn.java: ROLE/" + user.getActualRoleId( ) ) ;
		System.out.println( "MenuTareasIn.java: USER/" + user.getCveUsuario( ) ) ;
                System.out.println( "MenuTareasIn.java: COUNT/" + user.getActualCountName() + " , " + user.getActualCountId() ) ;
		
		// toma las no ejecutadas
		List< TblTareaPreimplementacion > preimplementationsOwn = MasterCardDAO.findAllWorksForRoleAndStatus( user.getActualRoleId( ) , 2 ) ;
                MasterCardDAO.closeEntityManager( ) ;
		
		System.out.println( "MenuTareasIn.java: num/" + preimplementationsOwn ) ;
		
		
		List< TareaPendienteTO > res = new ArrayList< TareaPendienteTO >( ) ;
		
		int cveCuenta = user.getActualCountId( ) ;
		
		// verifica que coincidan en roles
		for( TblTareaPreimplementacion tblTP : preimplementationsOwn )
		{
			System.out.println( "MenuTareasIn.java: tareaPreimplementacion/" + tblTP.getCveTareaPreimplementacion( ) ) ;
			
			// toma la tarea
			TblTarea tarea = tblTP.getTblTarea( ) ;
                        TblUsuario tblUsuario = user.getTblUsuario( ) ;
			
			// si esta desactivada
			if( tarea.getStatus( ) == 0 )
				// siguiente
				continue ;
                        
                        
                        if( user.getActualRoleId( ) == 4 ) {// VALIDACION PARA ROL AGENCIA
                            int cveAgenciaDeAsset = tblTP.getTblAsset( ).getTblAgencia( ).getCveAgencia( ) ,
                                    cveAgenciaDeUsuario = 0 ;                            
                            
                            List< TblAgencia > AgenciasUsuario = tblUsuario.getTblAgencias( ) ;
                            
                            for ( TblAgencia agencia : AgenciasUsuario ) {
                                // YA QUE UN USUARIO ADMINISTRA UNA SOLA AGENCIA
                                // EL FOR SOLO ES PARA OBTENER EL ID DE LA AGENCIA QUE ADMINISTRA EL USUARIO
                                cveAgenciaDeUsuario = agencia.getCveAgencia( ) ;
                            }
                            
                            if( cveAgenciaDeAsset != cveAgenciaDeUsuario )
                                continue ;
                            
                        }
			
			TblPreimplementacion preim = tblTP.getTblPreimplementacion( );
			
			System.out.println( "MenuTareasIn.java: preim/" + preim.getCvePreimplementacion( ) ) ;
			
			// verifica si es tarea de campania
			TblCampania camp = null ;
			
			if( preim != null )
				camp = preim.getTblCampania( ) ;
                        
                        if ( user.getActualRoleId() == 2 ){
                            
                            if( tblUsuario.getTblPais( ).getCvePais( ) != tblTP.getTblAsset( ).getTblPais( ).getCvePais( ) )
                                continue ;
                            
                            // en caso de que no sea null, que sea campania
			if( camp != null || tblTP.getTblPreimplementacion().getTblFlujo().getTipo() == 1 || 
                               tblTP.getTblPreimplementacion().getTblFlujo().getTipo() == 2 )
			{
				// en caso de que el rol sea banco
				int actualRole = tarea.getTblRole( ).getCveRole( ) ;
			
			// toma el flujo
			TblFlujo flujo = tarea.getTblFlujo( ) ;
			
			// si esta desactivado
			if( flujo.getStatus( ) == 0 )
				// siguiente
				continue ;

			
			System.out.println( "MenuTareasIn.java: " + MCUtil.isUserInLevelForPreimplementations( user.getTblUsuario( ) , tblTP.getTblTarea( ) ) ) ;
			
			// revisa si se va a agregar
			if( MCUtil.isUserInLevelForPreimplementations( user.getTblUsuario( ) , tblTP.getTblTarea( ) ) )
			{
				// verifica la fecha de activacion
				Timestamp fechaAct = tblTP.getFechaActiva( ) ;
				
				System.out.println( "MenuTareasIn.java: FechaActiva" + fechaAct ) ;
                                
				// en caso de ser null
				if( fechaAct == null )
					res.add( new TareaPendienteTO( tblTP ) ) ;
				// en caso de no ser null
				else
				{
					// compara la fecha con hoy
					GregorianCalendar gcActual = new GregorianCalendar( ) ;
					GregorianCalendar gcHoyInicio = new GregorianCalendar( gcActual.get( Calendar.YEAR ) , gcActual.get( Calendar.MONTH ) , gcActual.get( Calendar.DAY_OF_MONTH ) ) ;

					// agrega a menutareas en caso de que la fecha actual sea mayor a la fecha de activacion.
					// si es menor no la agrega porque todavia no llega la fecha de activacion
					if( gcHoyInicio.getTimeInMillis( ) >= fechaAct.getTime( ) )
						// agrega registro para desplegar en pantalla
						res.add( new TareaPendienteTO( tblTP ) ) ;
				}
				
			}// acaba el if para nivel
            }
                            
                            
                        }else if( user.getActualRoleId( ) == 5 )
                        {
                            //VALIDACIO PARA ROL "BDM TITULAR"
                            // EN CASO QUE LA SESION DEL USUARIO Y LA TAREA NO SEAN DEL MISMO AGRUPADOR: CONTINUA EL CICLO ACTUAL
                            System.out.println("(*_*)::::(*_*)::::(*_*)_____Campaña_____ " + 
                                    camp.getTblCuenta( ).getTblTipoCuenta( ).getNombre( ) ) ;
                            System.out.println( "(*_*)::::(*_*)::::(*_*)_____User_____ " + user.getCountType().getNombre( ) ) ;
                            if( camp.getTblCuenta( ).getTblTipoCuenta( ).getCveTipoCuenta( ) != user.getCountType( ).getCveTipoCuenta( ) )
                                continue;
                            
                            if( tblUsuario.getTblPais( ).getCvePais( ) != tblTP.getTblAsset( ).getTblPais( ).getCvePais( ) )
                                continue ;
			
			// toma el flujo
			TblFlujo flujo = tarea.getTblFlujo( ) ;
			
			// si esta desactivado
			if( flujo.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			System.out.println( "MenuTareasIn.java: " + MCUtil.isUserInLevelForPreimplementations( user.getTblUsuario( ) , tblTP.getTblTarea( ) ) ) ;
			
			// revisa si se va a agregar
			if( MCUtil.isUserInLevelForPreimplementations( user.getTblUsuario( ) , tblTP.getTblTarea( ) ) )
			{
				// verifica la fecha de activacion
				Timestamp fechaAct = tblTP.getFechaActiva( ) ;
				
				System.out.println( "MenuTareasIn.java: FechaActiva" + fechaAct ) ;
                                
				// en caso de ser null
				if( fechaAct == null )
					res.add( new TareaPendienteTO( tblTP ) ) ;
				// en caso de no ser null
				else
				{
					// compara la fecha con hoy
					GregorianCalendar gcActual = new GregorianCalendar( ) ;
					GregorianCalendar gcHoyInicio = new GregorianCalendar( gcActual.get( Calendar.YEAR ) , gcActual.get( Calendar.MONTH ) , gcActual.get( Calendar.DAY_OF_MONTH ) ) ;
					if( gcHoyInicio.getTimeInMillis( ) >= fechaAct.getTime( ) )
						// agrega registro para desplegar en pantalla
						res.add( new TareaPendienteTO( tblTP ) ) ;
				}
			}// acaba el if para nivel
                            
                        }else{
                            
                            // primero valida pais
                            if( user.getActualRoleId( ) == 1 || user.getActualRoleId( ) == 3 || user.getActualRoleId( ) == 10 )
                            {
                                if( tblUsuario.getTblPais( ).getCvePais( ) != tblTP.getTblAsset( ).getTblPais( ).getCvePais( ) )
                                    continue ;
                                
                            }
			
			// en caso de que no sea null, que sea campania
			if( ( camp != null && camp.getTblCuenta().getCveCuenta() == user.getActualCountId() ) || 
                               ( camp != null && user.getActualCountId( ) == -1 ) ||
                               ( tblTP.getTblPreimplementacion().getTblFlujo().getTipo() == 1 ) ||
                               ( camp == null && tblTP.getTblPreimplementacion().getTblFlujo().getTipo() == 2 ) )
			{
				// en caso de que el rol sea banco
				int actualRole = tarea.getTblRole( ).getCveRole( ) ;
			
			// toma el flujo
			TblFlujo flujo = tarea.getTblFlujo( ) ;
			
			// si esta desactivado
			if( flujo.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			System.out.println( "MenuTareasIn.java: " + MCUtil.isUserInLevelForPreimplementations( user.getTblUsuario( ) , tblTP.getTblTarea( ) ) ) ;
			
			// revisa si se va a agregar
			if( MCUtil.isUserInLevelForPreimplementations( user.getTblUsuario( ) , tblTP.getTblTarea( ) ) )
			{
				// verifica la fecha de activacion
				Timestamp fechaAct = tblTP.getFechaActiva( ) ;
				
				System.out.println( "MenuTareasIn.java: FechaActiva" + fechaAct ) ;

				// en caso de ser null
				if( fechaAct == null )
					res.add( new TareaPendienteTO( tblTP ) ) ;
				// en caso de no ser null
				else
				{
					// compara la fecha con hoy
					GregorianCalendar gcActual = new GregorianCalendar( ) ;
					GregorianCalendar gcHoyInicio = new GregorianCalendar( gcActual.get( Calendar.YEAR ) , gcActual.get( Calendar.MONTH ) , gcActual.get( Calendar.DAY_OF_MONTH ) ) ;
					

					if( gcHoyInicio.getTimeInMillis( ) >= fechaAct.getTime( ) )
						// agrega registro para desplegar en pantalla
						res.add( new TareaPendienteTO( tblTP ) ) ;
				}
//				
			}// acaba el if para nivel
            }//:::::::::::::::::::::::::::::::
              }// fin else
		}// acaba el for para tblTP
		
		TareaPendienteTO[ ] tareas = res.toArray( new TareaPendienteTO[ 0 ] ) ;
		
		Arrays.sort( tareas , new Comparator< TareaPendienteTO >( ) {
				public int compare( TareaPendienteTO to1 , TareaPendienteTO to2 )
				{
					// tom alas imagenes
					int img1 = to1.getImage( ) ;
					int img2 = to2.getImage( ) ;
					
					return img2 - img1 ;
				}
					} ) ;
		
		request.setAttribute( "TareaPreimplementaciones" , res ) ;
		
	  	if( user.getIdioma( ) == 1 ) {
                    return mapping.findForward( "successEng" ) ;
                } else {
                    return mapping.findForward( "success" ) ;
                }
                
	}
	
}
